package com.osstem;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.osstem.model.Staff;
import com.osstem.util.Util;

/**
 * 클래스설명 : DbManager
 * @version : 2011. 11. 14.
 * @author : jw
 * @분류 : 
 * 설명 : DbHelper class를 이용하요 crud를 작업해준다.
 *        테이블 자체가 많지 않아 통합적인 dao 객체 역할을 한다. 
 * ChangeSystem / package com.osstem;
 */

public class DbManager {
	private static final String DATABASE_NAME = "data";
	private static final String DATABASE_TABLE = "tb_staff";
	private static final int DATABASE_VERSION = 1;
	
	private DbHelper dbHelper;
	private SQLiteDatabase mDbReadable;
	private SQLiteDatabase mDbWritable;
	  
	public DbManager(Context context){
		dbHelper = new DbHelper(context);
		mDbReadable = dbHelper.getReadableDatabase();
		mDbWritable = dbHelper.getWritableDatabase();
	}

	
	/** 
	 * Method   : selectStaff
	 * 최초작성일  : 2011. 11. 14. 
	 * 작성자 : jw
	 * 변경이력 : 
	 * @return List
	 * Method 설명 : 조회된 직원의 금일날짜의 잔액 List를 리턴한다. 
	 */
	public List selectStaff(){
		 
		
		//금일 날짜를 조회한다.
    	String date = Util.getToday();
    	String[] params = {date};
    	
    	Cursor cursor = mDbReadable.query(DATABASE_TABLE, new String[] { "sabun", "name"}, null, null, null, null, null);
    	
		Cursor cursorAmount = mDbReadable.query("tb_insertamount", new String[] { "sabun", "amount", "date"}, "date = " + date, null, null, null, null);
		
		cursor.moveToFirst();
		cursorAmount.moveToFirst();
		
		Log.i("realTest", "cusor.size() = " + cursor.getCount() + " cursorAmount.size() = " + cursorAmount.getCount() );
		 
		ArrayList<Staff> staffList = new ArrayList<Staff>();
		 
		 
		for(int i = 0; i < cursor.getCount(); i++){
			Staff staff = new Staff();
			staff.setSabun(cursor.getString(0));
			staff.setName(cursor.getString(1));
			staff.setAmount("0");
			
			for(int j = 0; j < cursorAmount.getCount(); j++){
				if(staff.getSabun().equals(cursorAmount.getString(0))){
					staff.setAmount(cursorAmount.getString(1));
					break;
				}
				cursorAmount.moveToNext();
			}//end for j
			
			staffList.add(staff);
			cursorAmount.moveToFirst();
			cursor.moveToNext();
			
			Log.i("realTest", "sabun =" + staff.getSabun() + "amount = " + staff.getAmount());
			
		}//end for i
		cursorAmount.close();
		cursor.close();
		
		return staffList;
	}
	

	/** 
	 * Method   : insertAmount
	 * 최초작성일  : 2011. 11. 15. 
	 * 작성자 : jw
	 * 변경이력 : 
	 * @param sabun
	 * @param amount 
	 * Method 설명 : 금일날짜에 특정 직원의 잔액을 저장한다.
	 *               저장하기전 금일날짜로 입력된 건이 있는지 확인후 신규입력 / 업데이트 여부를 판단한다. 
	 */
	public void insertAmount(String sabun, String amount) {
			
    	String date = Util.getToday();
    	
    	//select를 먼저 해보고
    	String[] selectParams ={sabun, date};
    	//Cursor cursor = mDbReadable.query("tb_insertamount", new String[] { "sabun", "amount", "date"}, "date = " + date + " and sabun = " + sabun, null, null, null, null);
    	Cursor cursor = mDbReadable.rawQuery("select sabun, amount, date from tb_insertamount where sabun = ? and date = ? ", selectParams);
    	
		Log.i("realTest", "sabun = "  + sabun + " amount = " + amount + " date = "  + date + " cursor.getCount() = "  + cursor.getCount() );
		
		//이미 저장한 값이 있을경우-->업데이트
		if(cursor.getCount() > 0){
			String[] updateParams ={amount, sabun, date};
			mDbWritable.execSQL("update tb_insertamount set amount = ? where sabun = ? and date = ?" , updateParams);
			Log.i("realTest", "update complete");
		}
		//신규 입력 -->insert
		else{
			String[] insertParams ={amount, sabun, date};
			mDbWritable.execSQL("insert into tb_insertamount (amount, sabun, date) values (?, ?, ?)" , insertParams);
			Log.i("realTest", "insert complete");
		}
		cursor.close();
	}

	
	/** 
	 * Method   : clearToday
	 * 최초작성일  : 2011. 11. 15. 
	 * 작성자 : jw
	 * 변경이력 :  
	 * Method 설명 : 금일 입력된 모든 데이터를 삭제한다.
	 */
	public void clearToday() {
		//금일 날짜를 조회한다.
		String date = Util.getToday();
		String[] params = {date};
    	mDbWritable.execSQL("delete from tb_insertamount where date = ? " , params);
	}
		

	/** 
	 * Method   : selectDateAmount
	 * 최초작성일  : 2011. 11. 17. 
	 * 작성자 : jw
	 * 변경이력 : 
	 * @return 
	 * Method 설명 : 선택된 날짜의 잔액을 조회한다. 
	 */
	public ArrayList<Staff> selectDateAmount(String date) {
		Cursor cursor = mDbReadable.query(DATABASE_TABLE, new String[] { "sabun", "name"}, null, null, null, null, null);
		
		//입력된 날짜의 잔액을 조회한다.
    	String[] params = {date};    	
    	Cursor cursorAmount = mDbReadable.rawQuery("select sabun, amount from tb_insertamount where date = ? ", params);
    	
		cursor.moveToFirst();
		cursorAmount.moveToFirst();
		
		Log.i("realTest", "cusor.size() = " + cursor.getCount() + " cursorAmount.size() = " + cursorAmount.getCount() );
		 
		ArrayList<Staff> staffList = new ArrayList<Staff>();
		 
		 
		for(int i = 0; i < cursor.getCount(); i++){
			Staff staff = new Staff();
			staff.setSabun(cursor.getString(0));
			staff.setName(cursor.getString(1));
			staff.setAmount("0");
			
			for(int j = 0; j < cursorAmount.getCount(); j++){
				if(staff.getSabun().equals(cursorAmount.getString(0))){
					staff.setAmount(cursorAmount.getString(1));
					break;
				}
				cursorAmount.moveToNext();
			}//end for j
			
			staffList.add(staff);
			cursorAmount.moveToFirst();
			cursor.moveToNext();
			
			Log.i("realTest", "sabun =" + staff.getSabun() + "amount = " + staff.getAmount());
			
		}//end for i
		cursorAmount.close();
		cursor.close();
		
		return staffList;
	}
	
	
	/** 
	 * Method   : closeReadalbeDb
	 * 최초작성일  : 2011. 11. 17. 
	 * 작성자 : jw
	 * 변경이력 :  
	 * Method 설명 : readableDb를 close 
	 */
	public void closeReadalbeDb(){
		mDbReadable.close();
	}
	
	/** 
	 * Method   : closeWritableDb
	 * 최초작성일  : 2011. 11. 17. 
	 * 작성자 : jw
	 * 변경이력 :  
	 * Method 설명 : writableDb를 close 
	 */
	public void closeWritableDb(){
		mDbWritable.close();
	}
}
